package com.project.genesis.admin.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@EnableAsync
@Slf4j
public class AsyncTask {

//    @Autowired
//    private QuestionnaireMapper questionnaireMapper;
//
//    @Autowired
//    private PatientInfoMapper patientInfoMapper;
//
//    @Autowired
//    private HisFeignClient hisFeignClient;
//
//    @Autowired
//    private MQSendUtils mqSendUtils;
//
//    @Autowired
//    private AfterPushRecordMapper afterPushRecordMapper;
//
//    @Scheduled(cron = "0 0/15 *  * * ?")
//    @Async
//    @Transactional
//    public void pushFormAsync() {
//        log.info("定时任务执行了，执行时间:{}", new Date());
//        LocalDateTime nowTime = LocalDateTime.now();
//        //后续推送表单
//        this.formAfterPushAsync(nowTime);
//    }


    /**
     * 表单后续循环推送控制
     */
    private void formAfterPushAsync(LocalDateTime nowTime) {
//        LambdaQueryWrapper<Questionnaire> questionnaireWrapper = new LambdaQueryWrapper<>();
//        // 获取所有首次推送状态开启，且未删除的调查问卷
//        questionnaireWrapper.eq(Questionnaire::getFirstStatus, Constants.ENABLE)
//                .eq(Questionnaire::getIsDelete, Constants.UNDELETED);
//        List<Questionnaire> questionnaireList = questionnaireMapper.selectList(questionnaireWrapper);
//        // 获取所有已经添加到本系统小程序成员，状态是启用，未删除的患者信息，成员不允许重复，消息将会推送给这些成员
//        List<MemberIdCardBO> memberIdCardBOList = patientInfoMapper.listEnableAndUnDeleteMember(null);
//        List<String> idCardList = memberIdCardBOList.stream()
//                .map(MemberIdCardBO::getIdCard)
//                .distinct()
//                .collect(Collectors.toList());
//
//        /**
//         *
//         */
//        // 去后续推送表去查找满足条件的这批人的推送记录，（用来做判断的）
//        LambdaQueryWrapper<AfterPushRecord> afterPushRecordWrapper = new LambdaQueryWrapper<>();
//        afterPushRecordWrapper.in(CollectionUtils.isNotEmpty(idCardList), AfterPushRecord::getMemberIdCard, idCardList);
//        List<AfterPushRecord> afterPushRecordList = afterPushRecordMapper.selectList(afterPushRecordWrapper);
//        // 获取这些病人最新的出院时间
//        List<HzjkxxVO> hzjkxxVOList = hisFeignClient.listLatestHzjkxxByIdCard(idCardList);
//        List<MessageCenter> messageCenterList = new ArrayList<>();
//        // 循环表单+身份证  以表单为主
//        for (Questionnaire questionnaire : questionnaireList) {
//            //表单id
//            Long questionnaireId = questionnaire.getQuestionnaireId();
//            //后续推送周期天数
//            Integer afterPush = questionnaire.getAfterPush();
//            //前置校验:如果未设置跳过
//            if (afterPush == null) {
//                continue;
//            }
//            //后续推送周期频次
//            Integer afterPushFrequency = questionnaire.getAfterPushFrequency();
//            if (afterPushFrequency == null) {
//                continue;
//            }
//            //推送给满足条件的
//            for (String idCard : idCardList) {
//                // 设定推送时间：出院时间+预备首次推送时间
//                HzjkxxVO hzjkxxVO = hzjkxxVOList.stream()
//                        .filter(t -> idCard.equals(t.getIdcard()))
//                        .findFirst()
//                        .orElse(null);
//             //这里可以拿到病区id
//                MemberIdCardBO memberIdCardBO = memberIdCardBOList.stream()
//                        .filter(t -> t.getIdCard().equals(idCard))
//                        .findFirst()
//                        .orElse(null);
//                if (hzjkxxVO != null) {
//                    //出院日期
//                    LocalDateTime dateDischarge = hzjkxxVO.getDateDischarge();
//                    //再上次推送的天数上追加
//                    for (int i = 1; i <= afterPushFrequency; i++) {
//                        //根据身份证+表单id+频次确定这个患者在频次周期是否推送过表单
//                        int finalI = i;
//                        AfterPushRecord isPushPeson = afterPushRecordList.stream()
//                                .filter(t -> idCard.equals(t.getMemberIdCard()) && questionnaireId.equals(t.getQuestionnaireId()) && t.getAfterPushFrequency()
//                                        .equals(finalI))
//                                .findFirst()
//                                .orElse(null);
//                        int pushDay = 0;
//                        if (isPushPeson == null) {
//                            //拿到设置天数*频次的周期值
//                            pushDay = i * afterPush;
//                            int num = pushDay / 30;
//                            LocalDateTime afterPushDate = dateDischarge.plusDays(pushDay);
//                            if (afterPushDate.isBefore(nowTime)) {
//                                AfterPushRecord afterPushRecord = new AfterPushRecord();
//                                afterPushRecord.setAfterPushDate(afterPushDate);
//                                afterPushRecord.setMemberIdCard(idCard);
//                                afterPushRecord.setDateDischarge(dateDischarge);
//                                afterPushRecord.setQuestionnaireId(questionnaireId);
//                                //赋值推送频次
//                                afterPushRecord.setAfterPushFrequency(i);
//                                //后续表单推送交换机
//                                mqSendUtils.sendMsg(RabbitMQEnum.FORM_AFTER_EXCHANGE,
//                                        RabbitMQEnum.FORM_AFTER_ROUTING_KEY,
//                                        JSONObject.toJSONString(afterPushRecord),
//                                        30000);
//                                //消息中心消息
//                                String topic = "患者满" + num + "个月提示";
//                                String reminder = "你收到一个患者满" + num + "个月提示";
//                                MessageCenter messageCenter = new MessageCenter();
//                                messageCenter.setTopic(topic);
//                                messageCenter.setIdCard(idCard);
//                                messageCenter.setDiagnosis(hzjkxxVO.getZyzdname());
//                                messageCenter.setDateDischarge(dateDischarge);
//                                messageCenter.setReminder(reminder);
//                                messageCenter.setWardId(memberIdCardBO.getWardId());
//                                messageCenter.setPatientName(memberIdCardBO.getUserMemberName());
//                                messageCenterList.add(messageCenter);
//                            } else {
//                                continue;
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        //去重
//        List<MessageCenter> distinct = messageCenterList.stream()
//                .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(p -> p.getIdCard() + ";" + p.getTopic()))),
//                        ArrayList::new));
//        mqSendUtils.sendMsg(RabbitMQEnum.MESSAGE_CENTER_EXCHANGE,
//                RabbitMQEnum.MESSAGE_CENTER_ROUTING_KEY,
//                JSONObject.toJSONString(distinct),
//                30000);
//    }
    }
}
